package com.shijie.sjoj.model.base;

import com.shijie.sjoj.model.component.LogAnsi;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;

/**
 * 基础请求响应类
 *
 * @param <T>
 * @author ZSJ
 */
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Slf4j
public class ResponseBean<T> implements Serializable {

    /**
     * 响应码，请求成功失败的唯一标识，1：成功，0（或其他）：失败，
     */
    private String code;

    /**
     * 响应体，返回请求的响应数据
     */
    private T data;

    /**
     * 响应信息，返回请求的响应成功或失败信息，主要作为错误信息的载体
     */
    private String msg;

    /**
     * 默认请求成功响应码
     */
    private static final String CODE_DEFAULT_SUCCESS = "1-111";
//    private static final String CS000 = "1-000";
//    private static final String CS100 = "1-100";
//    private static final String CS010 = "1-010";
//    private static final String CS110 = "1-110";
//    private static final String CS001 = "1-001";
//    private static final String CS101 = "1-101";
//    private static final String CS011 = "1-011";
//    private static final String CS111 = "1-111";

    /**
     * 默认请求失败响应码
     */
    private static final String CODE_DEFAULT_ERROR = "0-000";
//    private static final String CE00 = "0-000";
//    private static final String CE10 = "0-010";
//    private static final String CE01 = "0-001";
//    private static final String CE11 = "0-011";

    /**
     * 请求成功默认信息
     */
    private static final String MSG_DEFAULT_SUCCESS = "success";

    /**
     * 请求失败默认信息
     */
    private static final String MSG_DEFAULT_ERROR = "error";

    /**
     * 获取请求响应对象实例
     *
     * @param type 数据类型
     * @return ResponseBean
     */
    public static <E> ResponseBean<E> newInstance(Class<E> type) {
        return new ResponseBean<>();
    }

    /**
     * 获取请求响应对象实例
     *
     * @param type 数据类型
     * @return ResponseBean
     */
    public static <E> ResponseBean<E> newInstance(E type) {
        return new ResponseBean<>();
    }

    /**
     * 获取请求响应对象实例
     *
     * @return ResponseBean
     */
    public static ResponseBean<Object> newInstance() {
        return new ResponseBean<>();
    }

    /**
     * 响应成功，添加返回的数据和信息
     *
     * @param data 响应数据
     * @param msg  响应信息
     */
    public void respSuccess(T data, String msg) {
        this.code = CODE_DEFAULT_SUCCESS;
        this.data = data;
        this.msg = msg;
        consoleInfo(this);
    }

    /**
     * 响应成功，添加返回的数据
     *
     * @param data 响应数据
     */
    public void respSuccess(T data) {
        this.respSuccess(data, MSG_DEFAULT_SUCCESS);
    }

    /**
     * 响应成功
     */
    public void respSuccess() {
        this.respSuccess(null, MSG_DEFAULT_SUCCESS);
    }

    /**
     * 响应失败，添加返回的错误信息
     *
     * @param msg String
     */
    public void respError(String msg) {
        this.code = CODE_DEFAULT_ERROR;
        this.data = null;
        this.msg = msg;
        consoleInfo(this);
    }

    /**
     * 响应失败，添加返回的错误信息
     */
    public void respError() {
        this.respError(MSG_DEFAULT_ERROR);
    }

    /**
     * 响应成功，返回数据和信息
     *
     * @param data 响应数据
     * @param msg  响应信息
     */
    public static <E> ResponseBean<E> success(E data, String msg) {
        ResponseBean<E> responseBean = newInstance(data);
        responseBean.respSuccess(data, msg);
        consoleInfo(responseBean);
        return responseBean;
    }

    /**
     * 响应成功，返回数据
     *
     * @param data 响应数据
     */
    public static <E> ResponseBean<E> success(E data) {
        return success(data, MSG_DEFAULT_SUCCESS);
    }

    /**
     * 响应成功
     */
    public static ResponseBean<Void> success() {
        return success(null, MSG_DEFAULT_SUCCESS);
    }

    /**
     * 响应失败，添加返回的错误信息
     *
     * @param msg String
     */
    public static ResponseBean<Void> error(String msg) {
        ResponseBean<Void> responseBean = newInstance(Void.class);
        responseBean.respError(msg);
        consoleInfo(responseBean);
        return responseBean;
    }

    /**
     * 响应失败
     */
    public static ResponseBean<Void> error() {
        return error(MSG_DEFAULT_ERROR);
    }

    /**
     * 响应情况输出
     *
     * @param responseBean 响应对象实例
     */
    public static <E> void consoleInfo(ResponseBean<E> responseBean) {
        log.info(LogAnsi.yellow("""
                请求响应：
                ---------- 预计返回响应 ----------
                --> （响应码） code：{}，
                --> （响应数据）data：{}，
                --> （响应信息）msg：{}，
                --------------------------------
                """), responseBean.getCode(), responseBean.getData(), responseBean.getMsg());
    }


}
